home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1994-09-22 | 2.3 KB | 87 lines |
- IMPLEMENTATION MODULE Conversions;
-
- FROM SYSTEM IMPORT LONG,SHORT;
-
- VAR digit : ARRAY [0..36] OF CHAR;
-
- PROCEDURE ConvertToString
- (n : LONGCARD; b : CARDINAL; neg : BOOLEAN;
- VAR s : ARRAY OF CHAR; VAR done : BOOLEAN);
- VAR pos, i : CARDINAL;
- m,fct : LONGCARD;
- base : LONGCARD;
- BEGIN
- done:=(HIGH(s)>=33) & (2<=b) & (b<=36);
- IF ~done THEN RETURN END;
- base:=LONG(b);
- fct:=1;
- i:=1;
- WHILE n DIV fct>=base DO
- fct:=fct*base;
- INC(i);
- END;
- pos:=0;
- IF neg THEN
- s[pos]:='-';
- INC(pos)
- END;
- WHILE i>0 DO
- m:=n DIV fct;
- s[pos]:=digit[SHORT(m)];
- n:=n-m*fct;
- fct:=fct DIV base;
- DEC(i);
- INC(pos)
- END;
- s[pos]:=0C
- END ConvertToString;
-
- PROCEDURE ConvertFromString
- (VAR s : ARRAY OF CHAR; b : CARDINAL; neg : BOOLEAN;
- max : LONGCARD; VAR result : LONGCARD; VAR done : BOOLEAN);
- VAR pos : CARDINAL;
- m,base : LONGCARD;
- n : RECORD
- CASE : BOOLEAN OF
- TRUE : c : LONGCARD |
- FALSE: i : LONGINT
- END
- END;
- BEGIN
- done:=(2<=b) & (b<=36) & (LONG(2)<=max);
- IF ~done THEN RETURN END;
- pos:=0;
- WHILE s[pos]=' ' DO INC(pos) END;
- IF neg THEN
- neg:=s[pos]='-';
- IF neg OR (s[pos]='+') THEN INC(pos) END
- END;
- base:=LONG(b);
- done:=('0'<=s[pos]) & (s[pos]<=digit[b-1]);
- IF ~done THEN RETURN END;
- n.c:=0;
- WHILE ('0'<=s[pos]) & (s[pos]<=digit[b-1]) DO
- done:=n.c<=max DIV base;
- IF ~done THEN RETURN END;
- m:=LONG(ORD(s[pos])-ORD('0'));
- IF m>LONG(9) THEN DEC(m,ORD('A')-ORD('9')-1) END;
- n.c:=n.c*base+m;
- INC(pos);
- done:=(pos<32) AND (n.c<=max);
- IF ~done THEN RETURN END
- END;
- done:=s[pos]<=' ';
- IF ~done THEN RETURN END;
- IF neg THEN
- n.i:=-n.i
- END;
- result:=n.c
- END ConvertFromString;
-
- BEGIN
-
- digit:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-
- END Conversions.
-
-